package IHM;

import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JPanel;
/**
 * Classe représentant un réseau de neurones graphiquement
 * @author philippestepniewski
 */
public class Cachees extends JPanel {

	private ArrayList<ArrayList<ArrayList<double[]>>> activations;
	private ArrayList<Couche> couchesTempsT;
	private int nbCouches;
	private int nbIterations;
	int sizeY;
	int sizeX;
	int milieuYJpanel;
	int milieuXJpanel;
        int tailleUneCouche;
	
	/**
	 * Construit l'ensemble du réseau de neurones graphiquement
	 * @param activations l'ensemble des activations pour toutes les etapes de lexperience
	 */
	public Cachees(ArrayList<ArrayList<ArrayList<double[]>>> activations,int iteration,int exempleI,int width,int height){
                this.sizeX=width;
                this.sizeY=height;
                this.tailleUneCouche=height;
                this.activations = activations;
		nbIterations = activations.size();
		nbCouches = activations.get(exempleI).get(iteration).size();
		couchesTempsT = creerCouches(iteration,exempleI);
                
	}
	
        /**
         * Créé les couches graphique du réseau de neurones une par une et les ajoutes à la représentation globale
         * @param iteration l'iteration à laquelle on veut afficher les couches
         * @param exempleI l'exemple auquel on veut afficher les couches
         * @return
         */
	public ArrayList<Couche> creerCouches(int iteration,int exempleI){

                ArrayList<Couche> lescouches = new ArrayList<Couche>();
		int tailleCotePlusgrandcouche=getSizePlusGrandCouche(iteration,exempleI);
		tailleCotePlusgrandcouche=(int)Math.ceil(Math.sqrt(tailleCotePlusgrandcouche));
		int departx=10;
		int departy=10;
		int cote= calcultailleCoteCarre(iteration,exempleI);
		int decalage=150;
                
                for(int i=0;i<nbCouches;i++){
                    lescouches.add(new Couche(activations.get(exempleI).get(iteration).get(i),departx,departy,cote,tailleUneCouche,tailleUneCouche));
                    lescouches.get(i).setNumero(i);
                    departx=departx+tailleUneCouche+decalage;
                }
		return lescouches;
	}
	/**
         * Calcul la taille d'un carré représentant un neurones en fonction de la taille maximale en pixel des couches
         * @param iteration l'iteration à laquelle on veut afficher les couches
         * @param exempleI l'exemple auquel on veut afficher les couches
         * @return
         */
	public int calcultailleCoteCarre(int iteration,int exempleI){
		int max= (int) Math.floor(Math.sqrt(getSizePlusGrandCouche(iteration,exempleI)));
		int cote=(int)Math.floor(tailleUneCouche/max);
		return cote;
	}
	/**
         * Calcul la taille maximale en pixel d'une couche de facon à ce qu'elle rentre dans l'ihm
         * @param iteration
         * @param exempleI
         * @return
         */
	public int getSizePlusGrandCouche(int iteration,int exempleI){
		int max=0;
		int sizei;
		for(int i=0;i<nbCouches;i++){
			sizei=activations.get(exempleI).get(iteration).get(i).length;
			if( sizei > max){
				max=sizei;
			}
		}
		return max;
	}
	
	

	public void paintComponent(Graphics g){	
                super.paintComponent(g);
                for(Couche c : couchesTempsT){
			c.paintComponent(g);
		}
                
	}
	/**
         * Met à jour l'affichage de la couche avec les paramètre
         * @param iteration l'iteration à laquelle on veut afficher les couches
         * @param exempleI l'exemple auquel on veut afficher les couches
         * @param height taille du panneau contenant la couche
         */
	public void maj(int iteration,int exempleI,int height){
            this.removeAll();
                this.tailleUneCouche=height;
		couchesTempsT = creerCouches(iteration,exempleI);
                this.updateUI();
	}

}
